/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package com.gft.bancosimulador.business;
import com.gft.bancosimulador.beans.*;
import com.gft.bancosimulador.outros.Sucesso;
import com.gft.bancosimulador.enume.SituacaoCliente;
import java.util.ArrayList;


import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.swing.JOptionPane;

/**
 *
 * @author AEPI
 */
public class ClienteBusiness {
    
    private Map<Integer, Cliente> clientes = new HashMap<Integer, Cliente>();
    
    
    private static final ClienteBusiness instance = new ClienteBusiness();
    
       
    public static ClienteBusiness getInstance(){
        return instance;
    }
    
    public Sucesso cadastrarClienteFisico(ClienteFisico cliente){
        
            this.clientes.put(cliente.getCodigo(), cliente);
            String msg = String.format("Cliente %s cadastrado com sucesso", cliente.getNome());
            Sucesso i = new Sucesso(msg,cliente);
            return i;  
        
    } 
    
    public Sucesso cadastrarClienteJuridico(ClienteJuridico cliente){
          this.clientes.put(cliente.getCodigo(), cliente);
          String msg = String.format("Cliente %s cadastrado com sucesso", cliente.getNome());
          Sucesso i = new Sucesso(msg, cliente);
          return i;
            }
    
    
    public Cliente consultarClientePorCodigo (int codigo){
          Cliente cliente = this.clientes.get(codigo);
          return cliente;
    }

    
    public List<Cliente> consultarClientePorNome (String nomeCliente){
        List<Cliente> cliente = new ArrayList<Cliente>();
        for(Cliente c: this.clientes.values()){
            if(c.getNome().contains(nomeCliente)){
                cliente.add(c);
            }
        }
        return cliente;
    }

   public Cliente consultarClientePorCpf(String docCliente){
       
        for(Cliente c:this.clientes.values()){
            if(c instanceof ClienteFisico){
                ClienteFisico clienteFisico = (ClienteFisico)c;
                if(clienteFisico.getDocumento().contains(docCliente)){
                    return clienteFisico;
                }
            }
        }
   
        return null;
   }
   
   public Cliente consultarClientePorCnpj(String docCliente){
       
        for(Cliente c:this.clientes.values()){
            if(c instanceof ClienteJuridico){
                ClienteJuridico clienteJuridico = (ClienteJuridico)c;
                if(clienteJuridico.getDocumento().contains(docCliente)){
                    return clienteJuridico;
                }
            }
        }
   
        return null;
   }
   
   public Sucesso alterarCliente(Cliente cliente){
       this.clientes.remove(cliente.getCodigo());
       this.clientes.put(cliente.getCodigo(), cliente);
       String msg = String.format("Cliente %s alterado com sucesso", cliente.getNome());
       Sucesso i = new Sucesso(msg,cliente);
       return i;
   }
   
   public Sucesso alterarCliente(ClienteFisico cliente){
       this.clientes.remove(cliente.getCodigo());
       this.clientes.put(cliente.getCodigo(), cliente);
       String msg = String.format("Cliente %s alterado com sucesso", cliente.getNome());
       Sucesso i = new Sucesso(msg,cliente);
       return i;
   }
   
   public Sucesso alterarCliente(ClienteJuridico cliente){
       this.clientes.remove(cliente.getCodigo());
       this.clientes.put(cliente.getCodigo(), cliente);
       String msg = String.format("Cliente %s alterado com sucesso", cliente.getNome());
       Sucesso i = new Sucesso(msg,cliente);
       return i;
   }
   
   public Sucesso cancelarCliente(Integer codigo){
       Cliente novo = this.clientes.get(codigo);
       novo.setSituacaoCliente(SituacaoCliente.CANCELADO);
       String msg = String.format("Cliente %s cancelado com sucesso", novo.getNome());
       Sucesso i = new Sucesso(msg, novo);
       return i; 
   }
   
   public Sucesso reativarCliente(Integer codigo){
       Cliente novo = this.clientes.get(codigo);
       novo.setSituacaoCliente(SituacaoCliente.ATIVO);
       String msg = String.format("Cliente %s reativado com sucesso", novo.getNome());
       Sucesso i = new Sucesso(msg, novo);
       return i;
   }
   
   public Sucesso bloquearCliente(Integer codigo){
       Cliente novo = this.clientes.get(codigo);
       novo.setSituacaoCliente(SituacaoCliente.BLOQUEADO);
       String msg = String.format("Cliente %s bloqueado com sucesso", novo.getNome());
       Sucesso i = new Sucesso(msg, novo);
       return i;
   }
    
    
    public List<Cliente> listarClientes(){
        List<Cliente> cliente = new ArrayList<Cliente>();
        for(Cliente c: this.clientes.values()){
            cliente.add(c);
        }
        
        return cliente;
    }
    
    public List<ClienteFisico> listarClientesFisicos(){
        List<ClienteFisico> cliente = new ArrayList<ClienteFisico>();
        for(Cliente c:this.clientes.values()){
            if(c instanceof ClienteFisico){
                cliente.add((ClienteFisico)c);
            }
        }
        return cliente;
    }
    
    public List<ClienteJuridico> listarClientesJuridicos(){
        List<ClienteJuridico> cliente = new ArrayList<ClienteJuridico>();
        for(Cliente c:this.clientes.values()){
            if(c instanceof ClienteJuridico){
                cliente.add((ClienteJuridico)c);
            }
        }
        return cliente;
    }
}
